package com.ocean.greedy.easy;

import java.util.Arrays;

/**
 * https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
 * <p>
 * K 次取反后最大化的数组和
 * <p>
 * <p>
 * 给你一个整数数组 nums 和一个整数 k ，按以下方法修改该数组：
 * <p>
 * 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
 * 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
 * <p>
 * 以这种方式修改数组后，返回数组 可能的最大和
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [4,2,3], k = 1
 * 输出：5
 * 解释：选择下标 1 ，nums 变为 [4,-2,3] 。
 * 示例 2：
 * <p>
 * 输入：nums = [3,-1,0,2], k = 3
 * 输出：6
 * 解释：选择下标 (1, 2, 2) ，nums 变为 [3,1,0,2] 。
 * 示例 3：
 * <p>
 * 输入：nums = [2,-3,-1,5,-4], k = 2
 * 输出：13
 * 解释：选择下标 (1, 4) ，nums 变为 [2,3,-1,5,4] 。
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= nums.length <= 104
 * -100 <= nums[i] <= 100
 * 1 <= k <= 104
 */
public class MaximizeSumOfArrayAfterKNegations {
    public static void main(String[] args) {
        MaximizeSumOfArrayAfterKNegations afterKNegations = new MaximizeSumOfArrayAfterKNegations();
        int[] nums1 = {4, 2, 3};
        int res = afterKNegations.largestSumAfterKNegations2(nums1, 1);
        System.out.println(res);
        int[] nums2 = {3, -1, 0, 2};
        res = afterKNegations.largestSumAfterKNegations2(nums2, 3);
        System.out.println(res);
        int[] nums3 = {2, -3, -1, 5, -4};
        res = afterKNegations.largestSumAfterKNegations2(nums3, 2);
        System.out.println(res);
    }


    public int largestSumAfterKNegations2(int[] nums, int k) {
        // 先排序
        Arrays.sort(nums);
        int m = nums.length;
        int sum = 0;
        // 记录一下最小的值
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < m; i++) {
            if (nums[i] < 0 && k > 0) {
                // 取反
                nums[i] = (-nums[i]);
                k--;
            }
            min = Math.min(min, nums[i]);
            sum += nums[i];
        }
        // 判断k是否还有
        return sum - (k % 2 == 0 ? 0 : 2) * min;
    }

    public int largestSumAfterKNegations(int[] nums, int k) {
        if (nums.length <= 1) {
            for (int i = 0; i < k; i++) {
                nums[0] = (-nums[0]);
            }
            return nums[0];
        }
        Arrays.sort(nums);
        // 每次都
        for (int i = 0; i < k; i++) {
            nums[0] = (-nums[0]);
            if (nums[0] < nums[1]) {
                continue;
            }
            Arrays.sort(nums);
        }
        // 求和
        int sum = 0;
        for (int each : nums) {
            sum += each;
        }
        return sum;
    }
}
